Formuła 1: predykcja i strategia
Celem niniejszego projektu jest analiza danych dotyczących wyścigów Formuły 1 z lat 2018–2024, obejmujących zarówno informacje o warunkach panujących na torze, jak i wskaźniki stylu jazdy kierowców, w tym poziomu agresji. Projekt zakłada ocenę skuteczności strategii zespołów wyścigowych oraz zbadanie wpływu stylu jazdy na ostateczny wynik wyścigu. Dodatkowo, celem jest opracowanie modeli predykcyjnych przewidujących końcową pozycję kierowcy na podstawie wybranych zmiennych, a także klasyfikacja strategii doboru i zużycia opon w kontekście warunków pogodowych oraz ocena ich efektywności.
| Season | Round | Circuit | Driver | Constructor | Laps | Position | TotalPitStops | AvgPitStopTime | Race.Name | Date | Time_of_race | Location | Country | Air_Temp_C | Track_Temp_C | Humidity_. | Wind_Speed_KMH | Lap.Time.Variation | Total.Pit.Stops | Tire.Usage.Aggression | Fast.Lap.Attempts | Position.Changes | Driver.Aggression.Score | Abbreviation | Stint | Tire.Compound | Stint.Length | Pit_Lap | Pit_Time |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2018 | 1 | Albert Park Grand Prix Circuit | Sebastian Vettel | Ferrari | 58 | 1 | 1 | 21.787 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0017235 | 0.1428571 | 0.0172414 | 44.76882 | 0.0000000 | 6.755003 | VET | 1 | ULTRASOFT | 25 | 26 | 21.787 |
| 2018 | 1 | Albert Park Grand Prix Circuit | Sebastian Vettel | Ferrari | 58 | 1 | 1 | 21.787 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0017235 | 0.1428571 | 0.0172414 | 44.76882 | 0.0000000 | 6.755003 | VET | 2 | SOFT | 32 | NA | Final Stint |
| 2018 | 1 | Albert Park Grand Prix Circuit | Lewis Hamilton | Mercedes | 58 | 2 | 1 | 21.821 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0017347 | 0.1428571 | 0.0172414 | 44.73482 | 0.0434783 | 6.754254 | HAM | 1 | ULTRASOFT | 17 | 19 | 21.821 |
| 2018 | 1 | Albert Park Grand Prix Circuit | Lewis Hamilton | Mercedes | 58 | 2 | 1 | 21.821 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0017347 | 0.1428571 | 0.0172414 | 44.73482 | 0.0434783 | 6.754254 | HAM | 2 | SOFT | 39 | NA | Final Stint |
| 2018 | 1 | Albert Park Grand Prix Circuit | Kimi Räikkönen | Ferrari | 58 | 3 | 1 | 21.421 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0016031 | 0.1428571 | 0.0172414 | 45.13482 | 0.0869565 | 6.818562 | RAI | 1 | ULTRASOFT | 17 | 18 | 21.421 |
| 2018 | 1 | Albert Park Grand Prix Circuit | Kimi Räikkönen | Ferrari | 58 | 3 | 1 | 21.421 | Australian Grand Prix | 25-03-2018 | 05:10:00Z | Melbourne | Australia | 15.78333 | 22.28333 | 57 | 23.8 | 0.0016031 | 0.1428571 | 0.0172414 | 45.13482 | 0.0869565 | 6.818562 | RAI | 2 | SOFT | 40 | NA | Final Stint |
## Season Round Circuit
## 0 0 0
## Driver Constructor Laps
## 0 0 0
## Position TotalPitStops AvgPitStopTime
## 0 0 185
## Race.Name Date Time_of_race
## 0 0 0
## Location Country Air_Temp_C
## 0 0 0
## Track_Temp_C Humidity_. Wind_Speed_KMH
## 0 0 0
## Lap.Time.Variation Total.Pit.Stops Tire.Usage.Aggression
## 185 0 66
## Fast.Lap.Attempts Position.Changes Driver.Aggression.Score
## 185 0 185
## Abbreviation Stint Tire.Compound
## 0 109 0
## Stint.Length Pit_Lap Pit_Time
## 109 2810 0
| Kolumna | Opis |
|---|---|
| Season | Rok sezonu wyścigowego |
| Round | Numer rundy w sezonie |
| Circuit | Nazwa toru wyścigowego |
| Driver | Imię i nazwisko kierowcy |
| Constructor | Zespół (np. Ferrari, Mercedes) |
| Laps | Liczba ukończonych okrążeń |
| Position | Pozycja końcowa w wyścigu |
| TotalPitStops | Liczba pit stopów kierowcy |
| AvgPitStopTime | Średni czas pit stopów (s) |
| Race Name | Oficjalna nazwa Grand Prix |
| Date | Data wyścigu |
| Time_of_race | Godzina rozpoczęcia wyścigu |
| Location | Miasto wyścigu |
| Country | Kraj, w którym odbywa się wyścig |
| Air_Temp_C | Temperatura powietrza (°C) |
| Track_Temp_C | Temperatura toru (°C) |
| Humidity_% | Wilgotność powietrza (%) |
| Wind_Speed_KMH | Prędkość wiatru (km/h) |
| Lap Time Variation | Zmienność czasów okrążeń |
| Tire Usage Aggression | Wskaźnik agresywnego zużycia opon |
| Fast Lap Attempts | Liczba prób najszybszego okrążenia |
| Position Changes | Zmiany pozycji w trakcie wyścigu |
| Driver Aggression Score | Ogólny wskaźnik agresji kierowcy |
| Abbreviation | Skrót nazwiska kierowcy |
| Stint | Numer stintu (fragment między pit stopami) |
| Tire Compound | Typ mieszanki opon |
| Stint Length | Długość stintu (okrążenia) |
| Pit_Lap | Okrążenie, na którym był pit stop |
| Pit_Time | Czas pit stopu lub ‘Final Stint’ |
## 'data.frame': 7265 obs. of 30 variables:
## $ Season : int 2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
## $ Round : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Circuit : chr "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" ...
## $ Driver : chr "Sebastian Vettel" "Sebastian Vettel" "Lewis Hamilton" "Lewis Hamilton" ...
## $ Constructor : chr "Ferrari" "Ferrari" "Mercedes" "Mercedes" ...
## $ Laps : int 58 58 58 58 58 58 58 58 58 58 ...
## $ Position : int 1 1 2 2 3 3 4 4 5 5 ...
## $ TotalPitStops : int 1 1 1 1 1 1 1 1 1 1 ...
## $ AvgPitStopTime : num 21.8 21.8 21.8 21.8 21.4 ...
## $ Race.Name : chr "Australian Grand Prix" "Australian Grand Prix" "Australian Grand Prix" "Australian Grand Prix" ...
## $ Date : chr "25-03-2018" "25-03-2018" "25-03-2018" "25-03-2018" ...
## $ Time_of_race : chr "05:10:00Z" "05:10:00Z" "05:10:00Z" "05:10:00Z" ...
## $ Location : chr "Melbourne" "Melbourne" "Melbourne" "Melbourne" ...
## $ Country : chr "Australia" "Australia" "Australia" "Australia" ...
## $ Air_Temp_C : num 15.8 15.8 15.8 15.8 15.8 ...
## $ Track_Temp_C : num 22.3 22.3 22.3 22.3 22.3 ...
## $ Humidity_. : num 57 57 57 57 57 57 57 57 57 57 ...
## $ Wind_Speed_KMH : num 23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 ...
## $ Lap.Time.Variation : num 0.00172 0.00172 0.00173 0.00173 0.0016 ...
## $ Total.Pit.Stops : num 0.143 0.143 0.143 0.143 0.143 ...
## $ Tire.Usage.Aggression : num 0.0172 0.0172 0.0172 0.0172 0.0172 ...
## $ Fast.Lap.Attempts : num 44.8 44.8 44.7 44.7 45.1 ...
## $ Position.Changes : num 0 0 0.0435 0.0435 0.087 ...
## $ Driver.Aggression.Score: num 6.76 6.76 6.75 6.75 6.82 ...
## $ Abbreviation : chr "VET" "VET" "HAM" "HAM" ...
## $ Stint : num 1 2 1 2 1 2 1 2 1 2 ...
## $ Tire.Compound : chr "ULTRASOFT" "SOFT" "ULTRASOFT" "SOFT" ...
## $ Stint.Length : num 25 32 17 39 17 40 25 32 25 32 ...
## $ Pit_Lap : num 26 NA 19 NA 18 NA 26 NA 26 NA ...
## $ Pit_Time : chr "21.787" "Final Stint" "21.821" "Final Stint" ...
## Season Round Circuit
## 0 0 0
## Driver Constructor Laps
## 0 0 0
## Position TotalPitStops AvgPitStopTime
## 0 0 171
## Race.Name Date Location
## 0 0 0
## Country Air_Temp_C Track_Temp_C
## 0 0 0
## Humidity_. Wind_Speed_KMH Lap.Time.Variation
## 0 0 112
## Tire.Usage.Aggression Fast.Lap.Attempts Position.Changes
## 59 171 0
## Driver.Aggression.Score Number_of_stints Avg_stint_length
## 112 0 0
## TOP3 DNF tire_strategy
## 0 0 0
## Driver.Fast.Lap.Attempts
## 112
Powyższa macierz korelacji pokazuje siłę liniowego związku między zmiennnymi przed wstępną ich selekcją oraz imputacją braków danych.
Powyższy histogram i wykres pudełkowy przedstawiają rozkład zmiennej
TotalPitStops, która jest sumą pit stopów, jakie miały
miejsce podczas danego wyścigu. Jak widać rozkład zmiennej
charakteryzuje widoczna asymetria prawostronna, zatem podczas wyścigów
przeważnie miejsce miał jeden pit stop. Jak widać na wykresie pudełkowym
występuje kilka obserwacji odstających, zmienną charakteryzuje znaczne
rozproszenie danych.
Powyższe wykresy pokazują,że zmienną Air_Temp_C
charakteryzuje rozkład niemal normalny, obserwacje są skupione wokół
średniej, występuje niewielka asymetria oraz obserwacje odstające
(zbliżone do 0 bądź powyżej 30 \(^oC\)
).
Powyższe wykresy przedstawiają rozkład zmiennej
Humidity_. , która określa poziom wilgotności powietrza na
torze. Jak widać charakteryzuje go asymetria lewostronna, zatem wyścigi
głównie odbywają się w warunkach o silnej wilgotności powietrza.
Na podstawie powyższych wykresów można stwierdzić,że zmienna
Wind_Speed_KMH charakteryzuje się asymetrią prawostronną,co
wskazuje na to,że dominują wyścigi, podczas których wiał delikatny
wiatr, co jest logiczne, ponieważ wyścigi nie mogą odbywać się podczas
silnych wiatrów.
Zmienna Lap.Time.Variation, mierząca zmienność czasów
okrążeń kierowców, wykazuje silną prawoskośność z większością wartości
skoncentrowanych blisko 0. Typowy kierowca utrzymuje bardzo stabilne
tempo wyścigowe, a jedynie sporadycznie występują duże odchylenia,
mogące świadczyć o błędach, pit stopach lub incydentach na torze.
Zmiana pozycji kierowców (Position.Changes) wykazuje
rozkład niemal równomierny, z wartościami rozłożonymi od 0 do około
0.85. Średnia zmiana pozycji wynosi około 0.4, co sugeruje umiarkowane
przesunięcia w klasyfikacji podczas wyścigu.
Zmienna Driver.Aggression.Score charakteryzuje się silną
asymetrią prawostronną, występuje wiele obserwacji odstających, jednak
większość kumuluje się w okolicy zera, zatem większość kierowców ma
podobny styl jazdy.
Zmienna Avg_stint_length obliczona na podstawie
Stint.Length charakteryzuje się rozkładem zbliżonym do
normalnego, większa część obserwacji skupia się wokół średniej, co
sugeruje ,że średnio kierowca jeździ na jednym komplecie opon około 20
okrążeń .Jednak występuje w niej wiele obserwacji odstających , na co
wpływ może mieć wyższy miernik Tire.Usage.Agression czy
fakt,że kierowca nie ukończył wyścigu.
\[ H_0: i-ta \ zmienna \ ma \ rozkład \ normalny\\ H_1:i-ta \ zmienna \ ma \ rozkład \ inny \ niż\ normalny\\ \]
| zmienna | ad_p | cvm_p | lillie_p |
|---|---|---|---|
| Air_Temp_C | 0 | 0 | 0 |
| AvgPitStopTime | 0 | 0 | 0 |
| Avg_stint_length | 0 | 0 | 0 |
| Driver.Aggression.Score | 0 | 0 | 0 |
| Driver.Fast.Lap.Attempts | 0 | 0 | 0 |
| Fast.Lap.Attempts | 0 | 0 | 0 |
| Humidity_. | 0 | 0 | 0 |
| Lap.Time.Variation | 0 | 0 | 0 |
| Laps | 0 | 0 | 0 |
| Number_of_stints | 0 | 0 | 0 |
| Position | 0 | 0 | 0 |
| Position.Changes | 0 | 0 | 0 |
| TOP3 | 0 | 0 | 0 |
| Tire.Usage.Aggression | 0 | 0 | 0 |
| TotalPitStops | 0 | 0 | 0 |
| Track_Temp_C | 0 | 0 | 0 |
| Wind_Speed_KMH | 0 | 0 | 0 |
Wniosek: Na podstawie przeprowadzonych testów zgodności i otrzymanej p-wartości, na poziomie istotności odrzucam \(H_0\) dla każdej zmiennej, zatem żadna z nich nie ma rozkładu normalnego.
| Variable | mean | sd | var | skewness | kurtosis |
|---|---|---|---|---|---|
| Air_Temp_C | 19.60 | 4.88 | 23.80 | -0.22 | 0.77 |
| AvgPitStopTime | 101.22 | 264.07 | 69732.35 | 4.89 | 31.34 |
| Avg_stint_length | 21.31 | 8.35 | 69.76 | -0.08 | 0.39 |
| Driver.Aggression.Score | 16.05 | 36.17 | 1308.33 | 5.40 | 38.43 |
| Driver.Fast.Lap.Attempts | 106.20 | 240.92 | 58040.82 | 5.40 | 38.48 |
| Fast.Lap.Attempts | 108.67 | 243.15 | 59120.93 | 5.35 | 37.68 |
| Humidity_. | 67.93 | 13.40 | 179.54 | -1.18 | 1.92 |
| Lap.Time.Variation | 0.03 | 0.09 | 0.01 | 4.95 | 32.12 |
| Laps | 54.19 | 17.08 | 291.79 | -1.59 | 2.73 |
| Number_of_stints | 2.83 | 1.20 | 1.44 | 1.37 | 2.74 |
| Position | 10.37 | 5.76 | 33.15 | 0.03 | -1.2 |
| Position.Changes | 0.41 | 0.25 | 0.06 | 0.03 | -1.2 |
| TOP3 | 0.13 | 0.34 | 0.12 | 2.16 | 2.68 |
| Tire.Usage.Aggression | 0.03 | 0.04 | 0.00 | 13.06 | 273.17 |
| TotalPitStops | 1.71 | 1.01 | 1.01 | 1.08 | 2.38 |
| Track_Temp_C | 25.28 | 4.99 | 24.85 | -0.16 | 0.69 |
| Wind_Speed_KMH | 11.37 | 5.89 | 34.69 | 1.30 | 1.88 |
## Variable MI_Score
## 1 Position 0.274
## 2 Position.Changes 0.274
## 3 Laps 0.095
## 4 TOP3 0.071
## 5 Avg_stint_length 0.030
## 6 Tire.Usage.Aggression 0.024
## 7 Wind_Speed_KMH 0.018
## 8 AvgPitStopTime 0.009
## 9 Track_Temp_C 0.009
## 10 Lap.Time.Variation 0.009
## 11 Fast.Lap.Attempts 0.009
## 12 Driver.Fast.Lap.Attempts 0.009
## 13 Air_Temp_C 0.007
## 14 Driver.Aggression.Score 0.007
## 15 tire_strategy 0.007
## 16 TotalPitStops 0.004
## 17 Number_of_stints 0.004
## 18 Humidity_. 0.003
Analiza Mutual Information wykazała, że zmiennymi o najwyższej
wartości informacyjnej względem zmiennej docelowej DNF są
Position oraz Position.Changes, uzyskując MI
na poziomie około \(0.3\). Zmienne
Laps i TOP3 również posiadają umiarkowaną
wartość informacyjną (odpowiednio \(~0.9\) i \(~0.07\)). Natomiast większość pozostałych
predyktorów, w szczególności zmienne opisujące warunki pogodowe
(Air_Temp_C, Track_Temp_C,
Humidity_.), za wyjątkiem Wind_Speed_KMH
wykazuje bardzo niską wartość MI (<0.02), co sugeruje ich marginalny
wpływ na wynik wyścigu i uzasadnia możliwość ich odrzucenia w dalszym
modelowaniu.
| Zmienna | p_value |
|---|---|
| Driver.Aggression.Score | 0.0025 |
| Lap.Time.Variation | 0.0032 |
| Avg_stint_length | 0.0001 |
| Laps | 0.0000 |
| Tire.Usage.Aggression | 0.0733 |
| Wind_Speed_KMH | 0.0000 |
| AvgPitStopTime | 0.0125 |
Na podstawie przeprowadzonych testów na równość średnich w grupach
można stwierdzić,że istnieją istotnie statystycznie różnice między
wartościami powyższych zmiennych w grupach wyznaczonych przez zmienną
DNF.
Macierz korelacji ujawnia istotne współzależności między częścią
predyktorów, szczególnie Position,
Position.Changes, TOP3 i Laps.
Zmienne te są częściowo redundantne i mogą prowadzić do współliniowości
w modelach liniowych. Z kolei zmienne takie jak
Wind_Speed_KMH i Tire.Usage.Aggression
wykazują niską korelację z pozostałymi, co może świadczyć o ich
niezależnym wkładzie informacyjnym.
##
## 1 2 3
## 392 973 1347
##
## Pearson's Chi-squared test
##
## data: table(formula1$Weather_Cluster, formula1$DNF)
## X-squared = 18.273, df = 2, p-value = 0.0001077
##
## 0 1
## 1 4.0337571 -4.0337571
## 2 0.1060774 -0.1060774
## 3 -2.9386776 2.9386776
Na podstawie wykresu i przeprowadzonego testu \(\chi^2\) można stwierdzić, że mimo iż
zmienne pogodowe były nieinformatywne, to pogoda i DNF nie są
niezależne. Na podstawie reszt residualnych, które dla pierwszego
klastra w klasie DNF=0 są większe od 2, można stwierdzić ,że w tym
klastrze jest więcej ukończonych wyścigów, mniej DNF niż oczekiwano —
bezpieczne warunki. Dla drugiego klastra mamy reszty bliskie 0, co
oznacza, że w tym klastrze panują umiarkowane warunki, wyścig ukończyło
tyle kierowców, ile przeciętnie. Dla trzeciego klastra więcej kierowców
nie ukończyło wyścigu niż oczekiwano, zatem w tym klastrze skupione są
mniej bezpieczne warunki- bardziej ryzykowne.
## # A tibble: 3 × 5
## Weather_Cluster avg_air_temp avg_track_temp avg_humidity avg_wind_speed
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 1 18.2 23.8 68.7 21.6
## 2 2 24.6 30.5 61.3 11.0
## 3 3 16.4 22.0 72.5 8.64
Powyższa wizualizacja i tabela podsumowują wnioski z analizy reszt
residualnych dla przeprowadzonego testu chi kwadrat.
Klaster 1 (najbezpieczniejszy ):
Klaster 2:
Klaster 3:
## # A tibble: 4 × 8
## klastry_kierowcy n Driver.Aggression.Score Lap.Time.Variation
## <fct> <int> <dbl> <dbl>
## 1 1 1038 6.54 0.00386
## 2 2 199 73.8 0.178
## 3 3 64 193. 0.439
## 4 4 1240 6.37 0.00268
## # ℹ 4 more variables: Avg_stint_length <dbl>, Laps <dbl>,
## # Tire.Usage.Aggression <dbl>, DNF_perc <dbl>
Kierowców udało się pogrupować w cztery wyraźnie różniące się klastry. Najbardziej agresywni i niestabilni (klaster 4) nie charakteryzują się najwyższym ryzykiem DNF. Największe ryzyko nie ukończenia wyścigu mieli kierowcy znajdujący się w klastrach 2 i 3. Większość zawodników należy do bardziej zachowawczych grup, co może przekładać się na większą skuteczność w kończeniu wyścigów. Segmentacja potwierdza, że styl jazdy wpływa na przebieg i wynik rywalizacji jednak różnice w jeździe kierowców, którzy nie ukończyli wyścigów są subtelne.
## [1] "Liczebność klas zmiennej DNF"
##
## 0 1
## 1560 1152
| Train-Global | Train-Class0 | Train-class1 | Test-Global | Test-Class0 | Test-Class1 | |
|---|---|---|---|---|---|---|
| Original Dataset (RF) | 0.97 | 0.98 | 0.96 | 0.85 | 0.86 | 0.85 |
| Original Dataset (LR) | 0.83 | 0.86 | 0.80 | 0.83 | 0.83 | 0.82 |
| Original Dataset (xgboost) | 0.93 | 0.95 | 0.91 | 0.86 | 0.87 | 0.86 |
| RF Imputed | 0.97 | 0.97 | 0.96 | 0.87 | 0.88 | 0.85 |
| LR Imputed | 0.85 | 0.87 | 0.82 | 0.83 | 0.84 | 0.83 |
| XGBOOST Imputed | 0.93 | 0.94 | 0.90 | 0.87 | 0.88 | 0.85 |
| RF SMOTE | 0.97 | 0.98 | 0.96 | 0.85 | 0.90 | 0.80 |
| LR SMOTE | 0.85 | 0.86 | 0.84 | 0.83 | 0.87 | 0.79 |
| XGBOOST SMOTE | 0.92 | 0.95 | 0.90 | 0.85 | 0.91 | 0.79 |
| RF Undersampled | 0.97 | 0.98 | 0.96 | 0.88 | 0.89 | 0.87 |
| LR Undersampled | 0.83 | 0.83 | 0.83 | 0.88 | 0.91 | 0.86 |
| XGBOOST Undersampled | 0.92 | 0.95 | 0.90 | 0.88 | 0.91 | 0.86 |
Na podstawie powyższych wartości accuracy dla każdego ze
zbiorów i modeli , decyduje się wybrać
XGBOOST Undersampled. Ten wariant osiąga najlepszy ogólny
wynik na zbiorze testowym oraz najlepsze wyniki dla obu klas, przy
zachowaniu równowagi między klasami i braku przeuczenia (różnice między
Train a Test są niewielkie).
Do strojenia hiperparametrów modelu XGBoost zastosowano optymalizację bayesowską, która opiera się na probabilistycznym modelowaniu funkcji celu i inteligentnym przeszukiwaniu przestrzeni parametrów. W przeciwieństwie do klasycznej siatki (grid search), podejście to szybciej znajduje kombinacje parametrów prowadzące do najlepszych wyników.
## # A tibble: 1 × 7
## mtry trees tree_depth learn_rate loss_reduction sample_size .config
## <int> <int> <int> <dbl> <dbl> <int> <chr>
## 1 1 283 4 0.0890 1.05 1 Iter20
## # A tibble: 3 × 4
## .metric .estimator .estimate .config
## <chr> <chr> <dbl> <chr>
## 1 accuracy binary 0.891 Preprocessor1_Model1
## 2 roc_auc binary 0.957 Preprocessor1_Model1
## 3 brier_class binary 0.0813 Preprocessor1_Model1
W wyniku optymalizacji bayesowskiej uzyskano skuteczny model XGBoost
(\(accuracy = 0.88\), \(AUC = 0.96\)), który łączy wysoką trafność
klasyfikacji z dobrą odpornością na przeuczenie. Kluczowe parametry,
takie jak niski learn_rate, umiarkowana głębokość drzew
(tree_depth) i loss_reduction, zapewniły
stabilne i uogólnione wyniki predykcyjne.
Krzywa ROC dla modelu XGBoost pokazuje, że klasyfikator bardzo dobrze rozróżnia przypadki DNF od pozostałych. Krzywa gwałtownie wznosi się ku lewemu górnemu rogowi wykresu, co oznacza wysoką czułość (sensitivity) przy jednocześnie niskim odsetku fałszywie pozytywnych wyników (1 - specificity). Obszar pod krzywą (AUC) wynoszący około 0.94 potwierdza, że model ma bardzo dobrą moc dyskryminacyjną i skutecznie identyfikuje rzadkie przypadki DNF, nawet przy niezbalansowanych danych.
Celem projektu była kompleksowa analiza danych z wyścigów Formuły 1 z lat 2018–2024, mająca na celu identyfikację czynników wpływających na nieukończenie wyścigu przez kierowców (zmienna DNF – Did Not Finish). Analiza koncentrowała się na dwóch głównych aspektach: warunkach pogodowych oraz stylu jazdy kierowców.
Na podstawie zmiennych meteorologicznych (temperatura powietrza i toru, wilgotność, prędkość wiatru) dokonano segmentacji warunków pogodowych, wyróżniając trzy klastry o odmiennym profilu ryzyka. Warunki umiarkowane (klaster 2) okazały się względnie neutralne dla DNF, natomiast ekstremalne warunki – zarówno gorące, jak i chłodne i wilgotne – istotnie wpływały na zwiększenie prawdopodobieństwa nieukończenia wyścigu.
Równolegle przeprowadzono segmentację stylów jazdy kierowców na podstawie wskaźników takich jak poziom agresji, zmienność czasu okrążeń czy długość stintów. Wyniki analizy wykazały, że największe ryzyko DNF występowało wśród kierowców z umiarkowaną niestabilnością i umiarkowaną agresją (klastry 2 i 3), podczas gdy najbardziej agresywni kierowcy niekoniecznie należeli do grupy najbardziej ryzykownej.
Przed modelowaniem przeprowadzono testy statystyczne i analizę korelacji, które pozwoliły wyselekcjonować najistotniejsze zmienne wejściowe. Do predykcji zmiennej DNF wybrano model XGBoost, który osiągnął wysoką skuteczność klasyfikacyjną (accuracy = 0.87, AUC = 0.94), zachowując przy tym dobrą równowagę między klasami i odporność na przeuczenie. Proces strojenia hiperparametrów przeprowadzono przy użyciu optymalizacji bayesowskiej, co pozwoliło uzyskać najbardziej efektywną konfigurację modelu.
Ostatecznie stworzony model umożliwia skuteczną klasyfikację kierowców pod względem ryzyka DNF, uwzględniając zarówno ich styl jazdy, jak i warunki pogodowe panujące podczas wyścigu. Wyniki analizy mogą być wykorzystane do wspomagania decyzji strategicznych zespołów F1, w tym w zakresie doboru opon, planowania stintów oraz oceny ryzyka w trudnych warunkach wyścigowych.